package com.galen.manual.context;

/**
 * 用户上下文持有者
 * 使用ThreadLocal存储当前线程的用户信息
 */
public class UserContextHolder {

    private static final ThreadLocal<UserContext> USER_CONTEXT_THREAD_LOCAL = new ThreadLocal<>();

    /**
     * 设置当前用户上下文
     *
     * @param userContext 用户上下文
     */
    public static void setUserContext(UserContext userContext) {
        USER_CONTEXT_THREAD_LOCAL.set(userContext);
    }

    /**
     * 获取当前用户上下文
     *
     * @return 用户上下文
     */
    public static UserContext getUserContext() {
        return USER_CONTEXT_THREAD_LOCAL.get();
    }

    /**
     * 获取当前用户ID
     *
     * @return 用户ID
     */
    public static Long getCurrentUserId() {
        UserContext context = getUserContext();
        return context != null ? context.getUserId() : null;
    }

    /**
     * 获取当前用户名
     *
     * @return 用户名
     */
    public static String getCurrentUsername() {
        UserContext context = getUserContext();
        return context != null ? context.getUsername() : null;
    }

    /**
     * 获取当前用户手机号
     *
     * @return 手机号
     */
    public static String getCurrentPhone() {
        UserContext context = getUserContext();
        return context != null ? context.getPhone() : null;
    }

    /**
     * 判断当前用户是否为管理员
     *
     * @return 是否为管理员
     */
    public static Boolean isCurrentUserAdmin() {
        UserContext context = getUserContext();
        return context != null && context.getIsAdmin();
    }

    /**
     * 获取当前管理员角色
     *
     * @return 管理员角色
     */
    public static String getCurrentAdminRole() {
        UserContext context = getUserContext();
        return context != null ? context.getAdminRole() : null;
    }

    /**
     * 清除当前用户上下文
     */
    public static void clear() {
        USER_CONTEXT_THREAD_LOCAL.remove();
    }

    /**
     * 检查是否有用户登录
     *
     * @return 是否有用户登录
     */
    public static boolean hasUser() {
        return getUserContext() != null;
    }

    /**
     * 检查当前用户是否为超级管理员
     *
     * @return 是否为超级管理员
     */
    public static boolean isCurrentUserSuperAdmin() {
        return "super".equals(getCurrentAdminRole());
    }

    /**
     * 获取当前用户Ip
     *
     * @return ip地址
     */
    public static String getClientIpAddress() {
        return getUserContext().getClientIpAddress();
    }

    /**
     * 获取当前用户浏览器代理
     *
     * @return 浏览器代理
     */
    public static String getUserAgent() {
        return getUserContext().getUserAgent();
    }
}